// 配置修正对象的特点：
// 1. 极少变化
// 使用配置修正后, 不能进行修改
// 目前分两种应用场景
// 1. 配置修正
// 2. 数据库读写
package cachex

import "gitee.com/zhongguo168a/gocodes/datax"

type IObject interface {
	RefSetThis(val IObject)
	RefUseModify()
	RefSetMapOrArrayModify(modify IModify)
	RefSetClassModify(field string, modify IModify)
	RefUseVersion()
	// 如果设置了schema, 返回schema的分类【catalog】
	RefClassCatalog() string
	// 如果是class类型, 返回class的类型名字, 否则返回空
	RefClassType() string
	// 通常作为Root才有ClassId
	RefClassId() string
	// 当对象为any类型时
	RefAnyType() string
	RefSetAnyType(val string)
	// RefUseModify打开修正功能后，需要设置上下文，提供给修正函数
	RefSetContext(modifyContext interface{})
	RefSetClassId(id string)
	RefGet(field string) (val interface{})
	// basic
	RefGetInt(field string) (val int)
	RefGetUint(field string) (val uint)
	RefGetFloat64(field string) (val float64)
	RefGetString(field string) (val string)
	RefGetBool(field string) (val bool)

	RefIsObject(field string) (r bool)
	// 明确知道当前字段的类型为Class/Map时使用，必然返回一个Object
	// 如果字段的值为nil，则创建对象，调用RefIsNil()返回true
	// 如果当前字段不是对象，发生异常
	RefGetObject(field string) IObject
	// 只支持基础类型的数组
	RefGetArray(field string) IObject

	RefSet(field string, val interface{}) error

	// 设置字段的值，如果字段的类型是Object，使用此方法
	RefSetObject(field string, val IObject)
	RefSetByPath(path string, val interface{})

	RefHas(field string) (val bool)

	RefIsNil() bool
	RefSetNil() IObject
	RefNewIfNil() IObject
	RefNew() IObject

	RefKeys() []string
	ToMap() datax.M
	toMap() datax.M

	// key-value
	// * 如果field为object/map
	// 		* 如果value==nil, 标识输出object/map的所有字段
	//		* 如果value==Map, 标识输出object/map中，Map的名字为Keys的字段
	ToMapByField(fieldMap datax.M) (r datax.M)
	toMapByField(fieldMap datax.M, r datax.M)
	RefLength() int
	RefNewByMap(data map[string]interface{})
	RefUpdate(data map[string]interface{})
	refUpdate(data map[string]interface{})
	RefRemove(field string)
	RefRemoveByMap(fieldMap map[string]interface{})
	refRemoveByMap(fieldMap map[string]interface{})

	RefReplaceObjectByPath(path string, val map[string]interface{})
}
